package com.maiko.maikoaiagent.tools;

import org.springframework.ai.tool.annotation.Tool;
import org.springframework.ai.tool.annotation.ToolParam;

import java.io.BufferedReader;
import java.io.IOException;
import java.io.InputStreamReader;

/**
 * TerminalOperationTool 是一个基于 {@link ProcessBuilder} 实现的终端命令执行工具类，
 * 可在 Windows 系统上通过 cmd.exe 执行用户提供的命令，并返回输出结果。
 *
 * 相比 Runtime.exec()，ProcessBuilder 提供了更清晰的命令格式、更强的控制能力（如重定向等）。
 *
 * 使用限制与安全性提示：
 * - 仅建议在受控环境或本地系统中使用，避免远程执行用户任意命令，防止命令注入。
 * - 建议加入命令白名单、超时机制等保护措施。
 * - 当前仅支持 Windows，如果运行在 Linux 下建议替换为 "/bin/bash", "-c", command。
 *
 * 示例：
 * TerminalOperationTool tool = new TerminalOperationTool();
 * String result = tool.executeTerminalCommand("dir");
 *
 * @author Maiko7
 * @create 2025-07-09 15:10
 */
public class TerminalOperationTool {

    /**
     * 执行传入的终端命令（通过 cmd.exe /c），并返回其输出结果。
     *
     * @param command 要在终端中执行的命令字符串（例如 "dir", "echo hello"）
     * @return 命令执行的输出结果（标准输出）；若出错返回错误信息或非 0 的退出码提示
     */
    @Tool(description = "Execute a command in the terminal")
    public String executeTerminalCommand(@ToolParam(description = "Command to execute in the terminal") String command) {
        StringBuilder output = new StringBuilder();
        try {
            // 创建 ProcessBuilder，指定通过 cmd.exe /c 执行命令（适用于 Windows）
            ProcessBuilder builder = new ProcessBuilder("cmd.exe", "/c", command);

            // 启动进程
            Process process = builder.start();

            // 读取标准输出内容
            try (BufferedReader reader = new BufferedReader(new InputStreamReader(process.getInputStream()))) {
                String line;
                while ((line = reader.readLine()) != null) {
                    output.append(line).append("\n");
                }
            }

            // 等待命令执行完毕，并检查退出码
            int exitCode = process.waitFor();
            if (exitCode != 0) {
                output.append("Command execution failed with exit code: ").append(exitCode);
            }

        } catch (IOException | InterruptedException e) {
            // 捕获异常并记录错误信息
            output.append("Error executing command: ").append(e.getMessage());
        }

        return output.toString();
    }
}





//public class TerminalOperationTool {
//
//    /**
//     * 执行传入的终端命令，并返回命令输出结果。
//     *
//     * @param command 要执行的终端命令（如 "ls", "echo hello", "ping www.baidu.com"）
//     * @return 命令执行的标准输出内容；如果失败则返回错误信息或非 0 退出码说明
//     */
//    @Tool(description = "Execute a command in the terminal")
//    public String executeTerminalCommand(
//            @ToolParam(description = "Command to execute in the terminal") String command) {
//
//        StringBuilder output = new StringBuilder();
//
//        try {
//            // 执行终端命令
//            Process process = Runtime.getRuntime().exec(command);
//
//            // 读取命令的标准输出流
//            try (BufferedReader reader = new BufferedReader(
//                    new InputStreamReader(process.getInputStream()))) {
//                String line;
//                while ((line = reader.readLine()) != null) {
//                    output.append(line).append("\n");
//                }
//            }
//
//            // 等待命令执行结束，并获取退出码
//            int exitCode = process.waitFor();
//            if (exitCode != 0) {
//                output.append("Command execution failed with exit code: ").append(exitCode);
//            }
//
//        } catch (IOException | InterruptedException e) {
//            // 捕获执行过程中的异常
//            output.append("Error executing command: ").append(e.getMessage());
//        }
//
//        return output.toString();
//    }
//}
